import { create } from 'zustand';
import { subscribeWithSelector } from 'zustand/middleware';
import { IDocument, ModelTreeObjectType } from '../types';

type IDocumentStore = {
  documentInfo: IDocument;
  setDocumentInfo: (documentInfo: IDocument) => void;
  /**
   * 自动调整模型渲染场景的视角，使得可以被全部看到；
   *
   * 在绘制模型（比如新画了一根线）和 在设置显隐时已经有可见的模型 时不需要调整视角，其他情况都需要；
   *
   * 使用 store 的存取该值的原因是：目前后端推送渲染数据过来，无法通过简单的传参来控制；
   */
  autoFitView: boolean;
  setAutoFitView: (autofit: boolean) => void;
  modelTreeInfo: ModelTreeObjectType[];
  setModelTreeInfo: (modelTreeInfo: ModelTreeObjectType[]) => void;
  /** 工作区对象（dxid），同一时间只有一个工作区 */
  workingObject?: string;
  /** 当前工作区的网格对象（dxid）*/
  workingMeshObject?: string;
  databaseInfo: any;
};
/**
 * 文档的数据，目前主要用于保存/设置模型树信息，其他的待移除
 */
export const useDocumentStore = create<IDocumentStore>()(
  subscribeWithSelector((set) => ({
    documentInfo: undefined,
    setDocumentInfo: (documentInfo) => set({ documentInfo }),
    autoFitView: true,
    setAutoFitView: (autoFitView) => set({ autoFitView }),
    modelTreeInfo: [],
    setModelTreeInfo: (modelTreeInfo) => {
      // 目前找到第一个根节点，设置为工作区
      const rootObject = modelTreeInfo[0];
      const meshObject = rootObject?.children?.find(
        (item) => item.type === 'MeshObject' && item.meshtype === 'mesh',
      );
      set({
        modelTreeInfo,
        workingObject: rootObject?.dxid,
        workingMeshObject: meshObject?.dxid,
      });
    },
    databaseInfo: undefined,
  })),
);
